home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 April: Mac OS SDK / Dev.CD Apr 96 SDK / Dev.CD Apr 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc / Sample Code / Sample Editors⁄Viewers / Sound Editor / Source / SampleCollections.cpp < prev    next >
Encoding:
Text File  |  1995-12-11  |  12.9 KB  |  617 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        Collections.cpp
  3.  
  4.     Contains:    Sample collection functions & classes
  5.  
  6.     Written by:    Steve Smith
  7.  
  8.     Copyright:    © 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Description:
  11.                 CList: Generic unordered list
  12.                 COrderedList: Generic ordered list
  13.                 CFrameList: Unordered list of frames -
  14.                             frames automatically refcounted when 
  15.                             added/removed from list.
  16.                 CQueue: Generic queue collection
  17.                 CStack: Generic stack collection
  18. */
  19.  
  20.  
  21. // -- Compiler/Preprocessor Switches --
  22.  
  23. #ifndef _COMPILERDEFS_
  24. #include "CompDefs.h"
  25. #endif
  26.  
  27. // -- OpenDoc Utilities --
  28.  
  29. #ifndef _EXCEPT_
  30. // Exceptions define several important macros (eg. CHECKENV)
  31. // which are used in the SOM method dispatch glue. If Except.h
  32. // is not included early enough, exceptions may not be thrown
  33. // correctly when returning from a SOM method with the "ev" parameter set.
  34. #include <Except.h>
  35. #endif
  36.  
  37. // -- SamplePart Includes --
  38.  
  39. #ifndef _SAMPLECOLLECTIONS_
  40. #include "SampleCollections.h"
  41. #endif
  42.  
  43. // -- OpenDoc Includes --
  44.  
  45. #ifndef _ODTYPES_
  46. #include <ODTypes.h>
  47. #endif
  48.  
  49. #ifndef SOM_ODFrame_xh
  50. #include <Frame.xh>
  51. #endif
  52.  
  53. // -- OpenDoc Utilities --
  54.  
  55. #ifndef _ODDEBUG_
  56. #include <ODDebug.h>
  57. #endif
  58.  
  59. #ifndef _ODUTILS_
  60. #include <ODUtils.h>
  61. #endif
  62.  
  63.  
  64. //====================================================================
  65. // CFrameLink
  66. //====================================================================
  67.  
  68. CFrameLink::CFrameLink(ODFrame* frame)
  69.     :CGenericLink()
  70. {
  71.     Environment* ev = somGetGlobalEnvironment();
  72.     ODAcquireObject(ev, frame);
  73.     fValue = (ODPtr)frame;
  74. }
  75.  
  76. CFrameLink::~CFrameLink()
  77. {
  78.     Environment* ev = somGetGlobalEnvironment();
  79.     ODFrame* currentFrame = (ODFrame*)fValue;
  80.     ODReleaseObject(ev, currentFrame);
  81. }
  82.  
  83. ODFrame* CFrameLink::GetFrame()
  84. {
  85.     return ((ODFrame*)fValue);
  86. }
  87.  
  88. void CFrameLink::SetFrame(ODFrame* frame)
  89. {
  90.     Environment* ev = somGetGlobalEnvironment();
  91.     ODAcquireObject(ev, frame);
  92.     
  93.     ODFrame* currentFrame = (ODFrame*)fValue;
  94.     ODReleaseObject(ev, currentFrame);
  95.     
  96.     fValue = (ODPtr)frame;
  97. }
  98.  
  99. //====================================================================
  100. // CList
  101. //====================================================================
  102.  
  103. ODBoolean CList::Contains(const ODPtr value)
  104. {
  105.     if ( fList.IsEmpty() ) return kODFalse;
  106.     
  107.     LinkedListIterator    iter(&fList);
  108.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  109.     {
  110.         if ( ((CGenericLink*)link)->GetValue() == value )
  111.             return kODTrue;
  112.     }
  113.  
  114.     return kODFalse;
  115. }
  116.  
  117. void CList::DeleteAllLinks()
  118. {
  119.     LinkedListIterator    iter(&fList);
  120.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  121.     {
  122.         delete (((CGenericLink*)link)->GetValue());
  123.     }
  124.     fList.RemoveAll();
  125. }
  126.  
  127. void CList::Delete(ODPtr value)
  128. {
  129.     LinkedListIterator    iter(&fList);
  130.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  131.     {
  132.         if ( ((CGenericLink*)link)->GetValue() == value )
  133.         {
  134.             delete (((CGenericLink*)link)->GetValue());
  135.             fList.Remove(*link);
  136.             return;
  137.         }
  138.     }
  139. }
  140.  
  141. void CList::Remove(ODPtr value)
  142. {
  143.     LinkedListIterator    iter(&fList);
  144.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  145.     {
  146.         if ( ((CGenericLink*)link)->GetValue() == value )
  147.         {
  148.             fList.Remove(*link);
  149.             return;
  150.         }
  151.     }
  152. }
  153.  
  154. void CList::Add(ODPtr value)
  155. {
  156.     CGenericLink* link = new CGenericLink(value);
  157.     fList.AddLast(link);
  158. }
  159.  
  160.  
  161. //====================================================================
  162. // CListIterator
  163. //====================================================================
  164.  
  165. CListIterator::CListIterator(CList* list)
  166. {
  167.     fIter = new LinkedListIterator(&list->fList);
  168. }
  169.  
  170. CListIterator::~CListIterator()
  171. {
  172.     delete fIter;
  173. }
  174.     
  175. ODPtr CListIterator::First()
  176. {
  177.     CGenericLink* link = (CGenericLink*) fIter->First();
  178.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  179. }
  180.  
  181. ODPtr CListIterator::Next()
  182. {
  183.     CGenericLink* link = (CGenericLink*) fIter->Next();
  184.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  185. }
  186.  
  187. ODPtr CListIterator::Previous()
  188. {
  189.     CGenericLink* link = (CGenericLink*) fIter->Previous();
  190.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  191. }
  192.  
  193. ODPtr CListIterator::Last()
  194. {
  195.     CGenericLink* link = (CGenericLink*) fIter->Last();
  196.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  197. }
  198.  
  199. ODPtr CListIterator::Current()
  200. {
  201.     CGenericLink* link = (CGenericLink*) fIter->Current();
  202.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  203. }
  204.  
  205. ODBoolean CListIterator::IsNotComplete()
  206. {
  207.     return fIter->IsNotComplete();
  208. }
  209.  
  210. void CListIterator::RemoveCurrent()
  211. {
  212.     fIter->RemoveCurrent();
  213. }
  214.  
  215. void CListIterator::DeleteCurrent()
  216. {
  217.     CGenericLink* link = (CGenericLink*) fIter->Current();
  218.     fIter->RemoveCurrent();
  219.     if ( link ) {
  220.         delete link->GetValue();
  221.         delete link;
  222.     }
  223. }
  224.  
  225. //====================================================================
  226. // COrderedList
  227. //====================================================================
  228.  
  229. ODBoolean COrderedList::Contains(const ODPtr value)
  230. {
  231.     if ( fList.IsEmpty() ) return kODFalse;
  232.     
  233.     LinkedListIterator    iter(&fList);
  234.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  235.     {
  236.         if ( ((CGenericLink*)link)->GetValue() == value )
  237.             return kODTrue;
  238.     }
  239.  
  240.     return kODFalse;
  241. }
  242.  
  243. ODUShort COrderedList::Position(const ODPtr value)
  244. {
  245.     if ( fList.IsEmpty() ) return kListIsEmpty;
  246.     
  247.     ODUShort position = 0;
  248.     LinkedListIterator    iter(&fList);
  249.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  250.     {
  251.         position++;
  252.         if ( ((CGenericLink*)link)->GetValue() == value )
  253.             return kODTrue;
  254.     }
  255.  
  256.     return kItemNotFound;
  257. }
  258.  
  259. void COrderedList::DeleteAllLinks()
  260. {
  261.     LinkedListIterator    iter(&fList);
  262.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  263.     {
  264.         delete (((CGenericLink*)link)->GetValue());
  265.     }
  266.     fList.RemoveAll();
  267. }
  268.  
  269. void COrderedList::Delete(ODPtr value)
  270. {
  271.     LinkedListIterator    iter(&fList);
  272.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  273.     {
  274.         if ( ((CGenericLink*)link)->GetValue() == value )
  275.         {
  276.             delete (((CGenericLink*)link)->GetValue());
  277.             fList.Remove(*link);
  278.             return;
  279.         }
  280.     }
  281. }
  282.  
  283. void COrderedList::Remove(ODPtr value)
  284. {
  285.     LinkedListIterator    iter(&fList);
  286.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  287.     {
  288.         if ( ((CGenericLink*)link)->GetValue() == value )
  289.         {
  290.             fList.Remove(*link);
  291.             return;
  292.         }
  293.     }
  294. }
  295.  
  296. ODPtr COrderedList::RemoveFirst()
  297. {
  298.     CGenericLink* link = (CGenericLink*) fList.RemoveFirst();
  299.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  300. }
  301.  
  302. ODPtr COrderedList::RemoveLast()
  303. {
  304.     CGenericLink* link = (CGenericLink*) fList.RemoveLast();
  305.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  306. }
  307.  
  308. void COrderedList::AddBefore(const ODPtr existing, ODPtr value)
  309. {
  310.     LinkedListIterator    iter(&fList);
  311.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  312.     {
  313.         if ( ((CGenericLink*)link)->GetValue() == existing )
  314.         {
  315.             CGenericLink* newLink = new CGenericLink(value);
  316.             fList.AddBefore(*link,newLink);
  317.             return;
  318.         }
  319.     }
  320. }
  321.  
  322. void COrderedList::AddAfter(const ODPtr existing, ODPtr value)
  323. {
  324.     LinkedListIterator    iter(&fList);
  325.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  326.     {
  327.         if ( ((CGenericLink*)link)->GetValue() == existing )
  328.         {
  329.             CGenericLink* newLink = new CGenericLink(value);
  330.             fList.AddAfter(*link,newLink);
  331.             return;
  332.         }
  333.     }
  334. }
  335.  
  336. void COrderedList::AddFirst(ODPtr value)
  337. {
  338.     CGenericLink* link = new CGenericLink(value);
  339.     fList.AddFirst(link);
  340. }
  341.  
  342. void COrderedList::AddLast(ODPtr value)
  343. {
  344.     CGenericLink* link = new CGenericLink(value);
  345.     fList.AddLast(link);
  346. }
  347.  
  348. ODPtr COrderedList::After(const ODPtr value) const
  349. {
  350.     LinkedListIterator    iter((LinkedList*)&fList);
  351.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  352.     {
  353.         if ( ((CGenericLink*)link)->GetValue() == value )
  354.         {
  355.             Link* after = fList.After(*link);
  356.             return (ODPtr)((CGenericLink*)after)->GetValue();
  357.         }
  358.     }
  359.     return kODNULL;
  360. }
  361.  
  362. ODPtr COrderedList::Before(const ODPtr value) const
  363. {
  364.     LinkedListIterator    iter((LinkedList*)&fList);
  365.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  366.     {
  367.         if ( ((CGenericLink*)link)->GetValue() == value )
  368.         {
  369.             Link* after = fList.Before(*link);
  370.             return (ODPtr)((CGenericLink*)after)->GetValue();
  371.         }
  372.     }
  373.     return kODNULL;
  374. }
  375.  
  376. ODPtr COrderedList::First() const
  377. {
  378.     CGenericLink* link = (CGenericLink*) fList.First();
  379.     return link ? (ODPtr)link->GetValue() : (ODPtr)kODNULL;
  380. }
  381.  
  382. ODPtr COrderedList::Last() const
  383. {
  384.     CGenericLink* link = (CGenericLink*) fList.Last();
  385.     return link ? (ODPtr)link->GetValue() : (ODPtr)kODNULL;
  386. }
  387.  
  388.  
  389. //====================================================================
  390. // CFrameList
  391. //====================================================================
  392.  
  393. CFrameList::~CFrameList()
  394. {
  395.     Environment* ev = somGetGlobalEnvironment();
  396.     
  397.     LinkedListIterator    iter(&fList);
  398.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  399.     {
  400.         iter.RemoveCurrent();
  401.         delete link;
  402.     }
  403. }
  404.  
  405. ODBoolean CFrameList::Contains(const ODFrame* frame)
  406. {
  407.     if ( fList.IsEmpty() ) return kODFalse;
  408.     
  409.     Environment* ev = somGetGlobalEnvironment();
  410.  
  411.     LinkedListIterator    iter(&fList);
  412.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  413.     {
  414.         if ( ODObjectsAreEqual(ev, ((CFrameLink*)link)->GetFrame(), (ODFrame*)frame) )
  415.             return kODTrue;
  416.     }
  417.  
  418.     return kODFalse;
  419. }
  420.  
  421. void CFrameList::Remove(ODFrame* frame)
  422. {
  423.     Environment* ev = somGetGlobalEnvironment();
  424.     Link* link = kODNULL;
  425.     
  426.     LinkedListIterator    iter(&fList);
  427.     for ( link=iter.First();iter.IsNotComplete();link=iter.Next())
  428.     {
  429.         if ( ODObjectsAreEqual(ev, ((CFrameLink*)link)->GetFrame(), frame) )
  430.             break;
  431.     }
  432.     
  433.     fList.Remove(*link);
  434.     delete link;
  435. }
  436.  
  437. void CFrameList::Add(ODFrame* frame)
  438. {
  439.     CFrameLink* link = new CFrameLink(frame);
  440.     fList.AddLast(link);
  441. }
  442.  
  443. ODFrame* CFrameList::GetFrame()
  444. {
  445.     CFrameLink* link = (CFrameLink*) fList.First();
  446.     return link->GetFrame();
  447. }
  448.  
  449. //====================================================================
  450. // CFrameListIterator
  451. //====================================================================
  452.  
  453. CFrameListIterator::CFrameListIterator(CFrameList* list)
  454. {
  455.     fIter = new LinkedListIterator(&list->fList);
  456. }
  457.  
  458. CFrameListIterator::~CFrameListIterator()
  459. {
  460.     delete fIter;
  461. }
  462.     
  463. ODFrame* CFrameListIterator::First()
  464. {
  465.     CFrameLink* link = (CFrameLink*) fIter->First();
  466.     return link ? link->GetFrame() : kODNULL;
  467. }
  468.  
  469. ODFrame* CFrameListIterator::Next()
  470. {
  471.     CFrameLink* link = (CFrameLink*) fIter->Next();
  472.     return link ? link->GetFrame() : kODNULL;
  473. }
  474.  
  475. ODFrame* CFrameListIterator::Previous()
  476. {
  477.     CFrameLink* link = (CFrameLink*) fIter->Previous();
  478.     return link ? link->GetFrame() : kODNULL;
  479. }
  480.  
  481. ODFrame* CFrameListIterator::Last()
  482. {
  483.     CFrameLink* link = (CFrameLink*) fIter->Last();
  484.     return link ? link->GetFrame() : kODNULL;
  485. }
  486.  
  487. ODFrame* CFrameListIterator::Current()
  488. {
  489.     CFrameLink* link = (CFrameLink*) fIter->Current();
  490.     return link ? link->GetFrame() : kODNULL;
  491. }
  492.  
  493. ODBoolean CFrameListIterator::IsNotComplete()
  494. {
  495.     return fIter->IsNotComplete();
  496. }
  497.  
  498. void CFrameListIterator::ReleaseCurrent()
  499. {
  500.     Environment* ev = somGetGlobalEnvironment();
  501.  
  502.     CFrameLink* link = (CFrameLink*) fIter->Current();
  503.     if ( link )
  504.         link->GetFrame()->Release(ev);
  505.     fIter->RemoveCurrent();
  506. }
  507.  
  508. //====================================================================
  509. // CStack
  510. //====================================================================
  511.  
  512. void CStack::EmptyStack(ODBoolean deleteEntries)
  513. {
  514.     if ( deleteEntries )
  515.     {
  516.         LinkedListIterator    iter(&fStack);
  517.         for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  518.         {
  519.             delete (((CGenericLink*)link)->GetValue());
  520.             fStack.Remove(*link);
  521.         }
  522.     }
  523.     else
  524.         fStack.DeleteAllLinks();
  525. }
  526.  
  527. ODUShort CStack::SetSize(ODUShort maxDepth)
  528. {
  529.     ODULong curSize = fStack.Count();
  530.     
  531.     if ( curSize > maxDepth )
  532.         fMaxDepth = (ODUShort) curSize;
  533.     else
  534.         fMaxDepth = maxDepth;
  535.     
  536.     return fMaxDepth;
  537. }
  538.  
  539. ODBoolean CStack::PushEntry(ODPtr entry)
  540. {
  541.     if ( (ODUShort)fStack.Count() < fMaxDepth )
  542.     {
  543.         CGenericLink* link = new CGenericLink(entry);
  544.         fStack.AddFirst(link);
  545.         return kODTrue;
  546.     }
  547.     else
  548.         return kODFalse;
  549. }
  550.  
  551. ODPtr CStack::PopEntry()
  552. {
  553.     if ( fStack.IsEmpty() )
  554.         return kODNULL;
  555.     else
  556.     {
  557.         CGenericLink* link = (CGenericLink*)fStack.RemoveFirst();
  558.         return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  559.     }
  560. }
  561.  
  562.  
  563. //====================================================================
  564. // CQueue
  565. //====================================================================
  566.  
  567. void CQueue::EmptyQueue(ODBoolean deleteEntries)
  568. {
  569.     if ( deleteEntries )
  570.     {
  571.         LinkedListIterator    iter(&fQueue);
  572.         for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  573.         {
  574.             delete (((CGenericLink*)link)->GetValue());
  575.             fQueue.Remove(*link);
  576.         }
  577.     }
  578.     else
  579.         fQueue.DeleteAllLinks();
  580. }
  581.  
  582. ODUShort CQueue::SetSize(ODUShort maxEntries)
  583. {
  584.     ODULong curSize = fQueue.Count();
  585.     
  586.     if ( curSize > maxEntries )
  587.         fMaxEntries = (ODUShort) curSize;
  588.     else
  589.         fMaxEntries = maxEntries;
  590.     
  591.     return fMaxEntries;
  592. }
  593.  
  594. ODBoolean CQueue::AddEntry(ODPtr entry)
  595. {
  596.     if ( (ODUShort)fQueue.Count() < fMaxEntries )
  597.     {
  598.         CGenericLink* link = new CGenericLink(entry);
  599.         fQueue.AddLast(link);
  600.         return kODTrue;
  601.     }
  602.     else
  603.         return kODFalse;
  604. }
  605.  
  606. ODPtr CQueue::GetEntry()
  607. {
  608.     if ( fQueue.IsEmpty() )
  609.         return kODNULL;
  610.     else
  611.     {
  612.         CGenericLink* link = (CGenericLink*)fQueue.RemoveFirst();
  613.         return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  614.     }
  615. }
  616.  
  617.